package com.imooc.controller;

import com.imooc.dto.OrderDto;
import com.imooc.enums.ResultEnum;
import com.imooc.exception.SellException;
import com.imooc.service.OrderService;
import com.imooc.service.PayService;
import com.lly835.bestpay.model.PayResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import java.util.Map;

/**
 * 功能描述: <br>
 * (支付模块)
 *
 * @Author:Mr. xyb
 * @Date: 2018/5/18 17:32
 * @since: 1.8.0
 * @version: 1.0.0
 */
@Controller
@RequestMapping("/pay")
public class PayController {

    @Autowired
    private OrderService orderService;

    @Autowired
    private PayService payService;

    /**
     * 发起支付
     * 注意：
     * 如果发起支付后，再取消支付
     * 此时其实已经在微信端创建了一个预付款订单
     * 就算你在本地修改了订单金额
     * 再次发起支付还是同样会是之前的价格
     *
     * @param orderId   订单id
     * @param returnUrl 回调链接
     * @param map       返回参数
     * @return
     */
    @GetMapping("/create")
    public ModelAndView create(@RequestParam("orderId") String orderId, @RequestParam("returnUrl") String returnUrl, Map<String, Object> map) {
        // 1、查询订单
        OrderDto orderDto = orderService.findOne(orderId);
        /*订单为空则抛异常*/
        if (orderDto == null) {
            throw new SellException(ResultEnum.ORDER_NOT_EXIST);
        }
        // 2、发起支付
        PayResponse payResponse = payService.create(orderDto);

        map.put("payResponse", payResponse);
        map.put("returnUrl", returnUrl);
        return new ModelAndView("pay/create", map);
    }

    /**
     * 回调方法
     *
     * @param notifyData 是一个xml格式的字符串，从微信端传过来的
     *                   详情请见：https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7
     * @return
     */
    @PostMapping("/notify")
    public ModelAndView notify(@RequestBody String notifyData) {
        // 回调执行一系列操作
        payService.notify(notifyData);
        return new ModelAndView("pay/success");
    }

}